/*	Nama file		: Event.c
	Deskripsi		: Body type dan prototype primitif type Event
	Nama pembuat	: Ni Made Satvika Iswari/23512077
	Hari / Tanggal	: Selasa, 25 September 2012
*/

#include "Event.h"

/** Getter dan Setter **/
int GetEventNo(Event E)
/* Mengembalikan Nomor ID Event E*/
{
	return E.Event_No;
}

char* GetEventName(Event E)
/* Mengembalikan Nama Event E */
{
	return E.Event_Name;
}

Point GetPlace(Event E)
/* Mengembalikan Tempat Event E */
{
	return E.Place;
}

DateTime GetDateTime(Event E)
/* Mengembalikan DateTime Event E */
{
	return E.DateTime;
}

ListStr GetNameList(Event E)
/* Mengembalikan daftar nama yang terlibat dalam Event E */
{
	return E.NameList;
}

void SetEventNo(Event *E, int newNo)
/* Proses : Mengubah Nomor ID Event E */
/* I.S : E sudah terbuat, newNo terdefinisi */
/* F.S : Nomor Event E berisi newNo */
{
	(*E).Event_No = newNo;
}
void SetEventName(Event *E, char* newName)
/* Proses : Mengubah Nama Event E */
/* I.S : E sudah terbuat, newName terdefinisi */
/* F.S : Nama Event E berisi newName */
{	
	strcpy((*E).Event_Name,newName);
}

void SetPlace(Event *E, Point newPlace)
/* Proses : Mengubah Tempat Event E */
/* I.S : E sudah terbuat, newPlace terdefinisi */
/* F.S : Tempat Event E berisi newPlace */
{
	(*E).Place = newPlace;
}

void SetDateTime(Event *E, DateTime newDateTime)
/* Proses : Mengubah DateTime Event E */
/* I.S : E sudah terbuat, newDateTime terdefinisi */
/* F.S : DateTime Event E berisi newDateTime */
{
	(*E).DateTime = newDateTime;
}

void SetNameList(Event *E, ListStr newNameList)
/* Proses : Mengubah daftar nama yang terlibat dalam Event E */
/* I.S : E sudah terbuat, newNameList terdefinisi */
/* F.S : NameList Event E berisi newNameList */
{
	(*E).NameList = newNameList;
}

void dealokasiList(Event *E){
/* Proses : menghapus/mendealokasi semua isi list nama partisipan */
/* I.S : E sudah terbuat */
/* F.S : daftar nama partisipan dalam Event E kosong atau menjadi NULL */
	/* Kamus Lokal */
	ListStr L;
	address P;
	/* Algoritma */
	L = GetNameList(*E);
	while(!ListEmpty(L)){
		P = First(L);
		First(L) = Next(First(L));
		Dealokasi(P);
	}
	CreateList(&L);
	SetNameList(E, L);
}

/** Pembuatan Event Baru  **/
Event MakeEvent (int eventNo, char* eventName, Point place, DateTime dateTime, ListStr nameList)
/* Proses : Membuat Event dari elemen - elemen yang terdefinisi */
/* I.S : Masing-masing elemen Event terdefinisi */
/* F.S : Event terbentuk dari elemen - elemen yang terdefinisi */
{
	/* Kamus Lokal */
	Event E;
	
	/* Algoritma */
	E.Event_Name = (char*) malloc (MAX_CHAR * sizeof(char));
	SetEventNo(&E, eventNo); 
	SetEventName(&E, eventName); 
	SetPlace(&E,place);
	SetDateTime (&E, dateTime);
	SetNameList(&E, nameList);
	
	return E;
}

/** Operator Baca/Tulis **/
void BacaEvent (Event *E)
/* I.S. Sembarang */
/* F.S. E terdefinisi dan merupakan Event yang valid */
/* Proses : Membaca komponen Event dari masukan pengguna */

/* Log Minggu, 7 Oktober : Ni Made Satvika Iswari menambahkan fungsi random */
{
	/* KAMUS */
	int pointX, pointY;	
	int timeH, timeM, timeS;
	int eventNo;
	char* eventName;
	
	Point place;
	Date date;
	Time time;
	DateTime dateTime;
	ListStr nameList;
	
	/* ALGORITMA */
	printf("**INPUT DATA EVENT YANG AKAN DITAMBAHKAN**\n");
	eventNo = rand() % 100000; 	//Nomor event ditambahkan secara random dari random generator
	printf("Nomor event (di-generate random) : %d\n", eventNo);
	
	printf("Masukkan nama event : "); 
	eventName = (char*) malloc (MAX_CHAR * sizeof(char));
	scanf(" %[^\n]s",eventName);
	
	printf("Membuat tempat event : \n");
	ReadPoint(&place);
	printf("Membuat waktu event :\n");
	BacaDateTime(&dateTime);
	printf("Membuat nama peserta event :\n");
	BacaList(&nameList);
	//Membuat Event

	*E = MakeEvent(eventNo, eventName, place, dateTime, nameList); 
}

void TulisEvent(Event E)
/* I.S. E terdefinisi */
/* F.S. Nilai E ditulis ke layar beserta komponen-komponennya */
/* Proses : Menulis nilai setiap komponen E ke layar */
{
	printf("Nomor event\t: %d\n", GetEventNo(E));
	printf("Nama event\t: %s\n", GetEventName(E));
	printf("Tempat event\t: (%s)\n", PointToString(GetPlace(E)));
	
	printf("Waktu event\t: %s\n", DateTimeToString(GetDateTime(E))); 
	//TulisDateTime(GetDateTime(E));
	printf("\n");
	printf("List nama\t: %s\n", ListStrToString(GetNameList(E)));
	//TulisList(GetNameList(E));
	printf("\n\n");
}

void UpdateEvent (Event *E)
/* Proses : Mengubah nilai E yang sudah terdefinisi */
/* I.S : E terdefinisi *?
/* F.S : Nilai masing-masing elemen E diisi dengan nilai baru */

/* Log Kamis, 5 Oktober 2012 : Ni Made Satvika menampilkan nilai elemen event yang lama */
/* Log 7 Oktober 2012 : KarinaNS membetulkan prosedur agar tidak error*/
{
	/* KAMUS */
	int eventNo;
	char* eventName;
	char* tmp;
	
	Point place;
	Date date;
	Time time;
	DateTime dateTime;
	ListStr nameList;
	
	/* ALGORITMA */
	eventName = (char*) malloc (MAX_CHAR * sizeof(char));
	tmp = (char*) malloc (MAX_CHAR * sizeof(char));
	printf("\n*** PERUBAHAN EVENT NO %d ***\n", GetEventNo(*E));
	eventNo = GetEventNo(*E); 
	
	printf("Nama event : %s\n", GetEventName(*E));
	printf("Masukkan nama event baru : "); 
	scanf(" %[^\n]s",tmp);
	strcpy(eventName, tmp);
	
	printf("Tempat event : (%s)\n", PointToString(GetPlace(*E)));
	ReadPoint(&place);
	
	printf("Waktu event : %s\n", DateTimeToString(GetDateTime(*E)));
	BacaDateTime(&dateTime);
	
	printf("List nama : %s\n", ListStrToString(GetNameList(*E)));
	BacaList(&nameList);
	
	//Membuat Event
	*E = MakeEvent(eventNo, eventName, place, dateTime, nameList); 
}
